package mx.uach.compiladores;

import java.util.StringTokenizer;

/**
 *<ul>
 * <li> sent → 
 * </ul>
 * @author Jesus Manuel Garcia Rico
 * @version 1.0
 * @since 6/03/2015
 */
public class AnalizadorSintacticoAvanzado {
    
    private static final int FIN_SENT = ';';
    private static final int SUMA = '+';
    private static final int RESTA = '-';
    private static final int MULTIPLICACION = '*';
    private static final int DIVISION = '/';
    private static final int PAR_DER =')';
    private static final int PAR_IZQ ='(';
    private static final int NUMERO = 600;
    private static final int ID = 700;
    
    private Integer linea = 1;
    private StringTokenizer tokenier;
    
    private StringTokenizer getTokenizer(String codigoFuente){
        //;+-*/()
        if(this.tokenier == null){
            String alfabeto = String.format("%s%s%s%s%s%s%s",
                    (char) FIN_SENT,
                    (char) SUMA, 
                    (char) RESTA, 
                    (char) MULTIPLICACION,
                    (char) DIVISION,
                    (char) PAR_DER,
                    (char) PAR_IZQ
            );
            this.tokenier = new StringTokenizer(
                    codigoFuente.trim(), alfabeto, true);
        }
        return this.tokenier;
    }
    
    private Token lex(String codigoFuente){
        Token token = null;
        
        String currentToken = 
                this.getTokenizer(codigoFuente).nextToken();
        if(esNumero(currentToken)){
            token = new Token(this.linea, NUMERO, currentToken);
        }else{
            int tokenSimple = currentToken.charAt(0);
            switch(tokenSimple){
                case FIN_SENT:
                    linea ++;
                    token = new Token(this.linea, FIN_SENT,
                            String.format("%s", (char)tokenSimple));
                    break;
                case SUMA:
                    token = new Token(this.linea, 
                            SUMA, String.format("%s", (char)tokenSimple));
                    break;
                case MULTIPLICACION:
                    token = new Token(this.linea, 
                       MULTIPLICACION, String.format("%s", (char)tokenSimple));
                    break;
                case DIVISION:
                    token = new Token(this.linea, 
                            DIVISION, String.format("%s", (char)tokenSimple));
                    break;
                case PAR_DER:
                    token = new Token(this.linea, 
                            PAR_DER, String.format("%s", (char)tokenSimple));
                    break;
                case PAR_IZQ:
                    token = new Token(this.linea, 
                            PAR_IZQ, String.format("%s", (char)tokenSimple));
                    break;
                default:
                    throw new Error("Error de Léxico: "
                            + "El caracter no esta dentro del lexico");
            }
            
        }
        return token;
    }
    
    public static Boolean esNumero(String textoRevisar){
        Boolean esNumero = true;
        for (int i = 0; i < textoRevisar.length(); i++) {
            esNumero = esNumero && 
                    Character.isDigit(textoRevisar.charAt(i));
        }
        return esNumero;
    }
    
    public static void main(String... args) {
        AnalizadorSintacticoAvanzado analizador = 
                new AnalizadorSintacticoAvanzado();
        while(analizador.getTokenizer("5+3").hasMoreTokens()){
            Token t = analizador.lex("");
            System.out.println(t);
        }
    }
   
}
